延續昨天介紹 LinkedBlockingQueue class 的部份,今天要介紹如何把 LinkedBlockingQueue 的資料取出來以及檢查元素的值。
取出元素的方式可以呼叫 poll 和 take 二種的方法,以下分別寫一段 sample code 來說明呼叫這二種方法之間的差異:
(1)呼叫 poll 方法
import java.util.concurrent.LinkedBlockingQueue;
public class PollQueueExample {
public static void main(String args[]) {
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>();
queue.add("aaa");
String element1 = queue.poll();
System.out.println(element1);
String element2 = queue.poll();
System.out.println(element2);
}
}
以上的程式會先把資料放到 Queue 裡面然後會呼叫 poll 方法,去取得資料。當 Queue 裡面沒有資料時會傳回 NULL 的值。
以下為執行結果:
aaa
null
(2)呼叫 take 方法
import java.util.concurrent.LinkedBlockingQueue;
public class TakeQueueExample {
public static void main(String args[]) throws Exception{
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>();
queue.add("aaa");
String element1 = queue.take();
System.out.println(element1);
String element2 = queue.take();
System.out.println(element2);
}
}
上面的程式會呼叫 take 方法去取得資料,當 Queue 裡面已經沒有資料時,資料就會一直在等待 Queue 裡面有資料,所以程式就不會停止執行。以下為執行的結果:
aaa
poll 和 take 主要的差異就是在取資料時 Queue 為空的時侯,前者會收到 Null,後者程式就會被阻塞住。
檢查 Queue 裡面有沒有資料可以呼叫 element 和 peek 二種的方法,以下也會分別寫一段 sample code 來表示它們之間差異的地方:
(1)呼叫 element 方法
import java.util.concurrent.LinkedBlockingQueue;
public class ElementQueueExample {
public static void main(String args[]) {
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>();
queue.add("aaa");
String element1 = queue.element();
System.out.println(element1);
String element2 = queue.element();
System.out.println(element2);
queue.remove();
String element3 = queue.element();
System.out.println(element3);
}
}
在以上的程式首先會放入資料到 Queue 裡,然後使用 element 方法把資料的值取出來,但是不會把 Queue 裡面的資料刪除。當 Queue 裡沒有資料時就會收到 NoSuchElementException 的錯誤訊息,執行的結果如下:
aaa
aaa
Exception in thread "main" java.util.NoSuchElementException
at java.util.AbstractQueue.element(AbstractQueue.java:136)
at com.company.ElementQueueExample.main(ElementQueueExample.java:16)
(2)呼叫 peek 方法
import java.util.concurrent.LinkedBlockingQueue;
public class PeekQueueExample {
public static void main(String args[]) throws Exception{
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>();
queue.add("aaa");
String element1 = queue.peek();
System.out.println(element1);
String element2 = queue.peek();
System.out.println(element2);
queue.remove();
String element3 = queue.peek();
System.out.println(element3);
}
}
以上的程式是使用 peek 的方法去取得資料,當 Queue 裡沒有資料的時候呼叫 peek 方法會印出 null 的字串,執行結果如下:
aaa
aaa
null
因此 element 和 peek 主要的差別是當 Queue 為空的時侯呼叫 element 方法會收到 Exception,而 peek 會收到 Null 的值。